#!/usr/bin/python
#
# Copyright 2009 Google Inc. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Contains extensions to Atom objects used with Google Documents."""

__author__ = ('api.jfisher (Jeff Fisher), '
              'api.eric@google.com (Eric Bidelman)')

import atom
import gdata


DOCUMENTS_NAMESPACE = 'http://schemas.google.com/docs/2007'


class Scope(atom.AtomBase):
    """The DocList ACL scope element"""

    _tag = 'scope'
    _namespace = gdata.GACL_NAMESPACE
    _children = atom.AtomBase._children.copy()
    _attributes = atom.AtomBase._attributes.copy()
    _attributes['value'] = 'value'
    _attributes['type'] = 'type'

    def __init__(self, value=None, type=None, extension_elements=None,
                 extension_attributes=None, text=None):
        self.value = value
        self.type = type
        self.text = text
        self.extension_elements = extension_elements or []
        self.extension_attributes = extension_attributes or {}


class Role(atom.AtomBase):
    """The DocList ACL role element"""

    _tag = 'role'
    _namespace = gdata.GACL_NAMESPACE
    _children = atom.AtomBase._children.copy()
    _attributes = atom.AtomBase._attributes.copy()
    _attributes['value'] = 'value'

    def __init__(self, value=None, extension_elements=None,
                 extension_attributes=None, text=None):
        self.value = value
        self.text = text
        self.extension_elements = extension_elements or []
        self.extension_attributes = extension_attributes or {}


class FeedLink(atom.AtomBase):
    """The DocList gd:feedLink element"""

    _tag = 'feedLink'
    _namespace = gdata.GDATA_NAMESPACE
    _attributes = atom.AtomBase._attributes.copy()
    _attributes['rel'] = 'rel'
    _attributes['href'] = 'href'

    def __init__(self, href=None, rel=None, text=None, extension_elements=None,
                 extension_attributes=None):
        self.href = href
        self.rel = rel
        atom.AtomBase.__init__(self, extension_elements=extension_elements,
                               extension_attributes=extension_attributes, text=text)


class ResourceId(atom.AtomBase):
    """The DocList gd:resourceId element"""

    _tag = 'resourceId'
    _namespace = gdata.GDATA_NAMESPACE
    _children = atom.AtomBase._children.copy()
    _attributes = atom.AtomBase._attributes.copy()
    _attributes['value'] = 'value'

    def __init__(self, value=None, extension_elements=None,
                 extension_attributes=None, text=None):
        self.value = value
        self.text = text
        self.extension_elements = extension_elements or []
        self.extension_attributes = extension_attributes or {}


class LastModifiedBy(atom.Person):
    """The DocList gd:lastModifiedBy element"""

    _tag = 'lastModifiedBy'
    _namespace = gdata.GDATA_NAMESPACE


class LastViewed(atom.Person):
    """The DocList gd:lastViewed element"""

    _tag = 'lastViewed'
    _namespace = gdata.GDATA_NAMESPACE


class WritersCanInvite(atom.AtomBase):
    """The DocList docs:writersCanInvite element"""

    _tag = 'writersCanInvite'
    _namespace = DOCUMENTS_NAMESPACE
    _attributes = atom.AtomBase._attributes.copy()
    _attributes['value'] = 'value'


class DocumentListEntry(gdata.GDataEntry):
    """The Google Documents version of an Atom Entry"""

    _tag = gdata.GDataEntry._tag
    _namespace = atom.ATOM_NAMESPACE
    _children = gdata.GDataEntry._children.copy()
    _attributes = gdata.GDataEntry._attributes.copy()
    _children['{%s}feedLink' % gdata.GDATA_NAMESPACE] = ('feedLink', FeedLink)
    _children['{%s}resourceId' % gdata.GDATA_NAMESPACE] = ('resourceId',
                                                           ResourceId)
    _children['{%s}lastModifiedBy' % gdata.GDATA_NAMESPACE] = ('lastModifiedBy',
                                                               LastModifiedBy)
    _children['{%s}lastViewed' % gdata.GDATA_NAMESPACE] = ('lastViewed',
                                                           LastViewed)
    _children['{%s}writersCanInvite' % DOCUMENTS_NAMESPACE] = (
        'writersCanInvite', WritersCanInvite)

    def __init__(self, resourceId=None, feedLink=None, lastViewed=None,
                 lastModifiedBy=None, writersCanInvite=None, author=None,
                 category=None, content=None, atom_id=None, link=None,
                 published=None, title=None, updated=None, text=None,
                 extension_elements=None, extension_attributes=None):
        self.feedLink = feedLink
        self.lastViewed = lastViewed
        self.lastModifiedBy = lastModifiedBy
        self.resourceId = resourceId
        self.writersCanInvite = writersCanInvite
        gdata.GDataEntry.__init__(
            self, author=author, category=category, content=content,
            atom_id=atom_id, link=link, published=published, title=title,
            updated=updated, extension_elements=extension_elements,
            extension_attributes=extension_attributes, text=text)

    def GetAclLink(self):
        """Extracts the DocListEntry's <gd:feedLink>.

        Returns:
          A FeedLink object.
        """
        return self.feedLink

    def GetDocumentType(self):
        """Extracts the type of document from the DocListEntry.

        This method returns the type of document the DocListEntry
        represents.  Possible values are document, presentation,
        spreadsheet, folder, or pdf.

        Returns:
          A string representing the type of document.
        """
        if self.category:
            for category in self.category:
                if category.scheme == gdata.GDATA_NAMESPACE + '#kind':
                    return category.label
        else:
            return None


def DocumentListEntryFromString(xml_string):
    """Converts an XML string into a DocumentListEntry object.

    Args:
      xml_string: string The XML describing a Document List feed entry.

    Returns:
      A DocumentListEntry object corresponding to the given XML.
    """
    return atom.CreateClassFromXMLString(DocumentListEntry, xml_string)


class DocumentListAclEntry(gdata.GDataEntry):
    """A DocList ACL Entry flavor of an Atom Entry"""

    _tag = gdata.GDataEntry._tag
    _namespace = gdata.GDataEntry._namespace
    _children = gdata.GDataEntry._children.copy()
    _attributes = gdata.GDataEntry._attributes.copy()
    _children['{%s}scope' % gdata.GACL_NAMESPACE] = ('scope', Scope)
    _children['{%s}role' % gdata.GACL_NAMESPACE] = ('role', Role)

    def __init__(self, category=None, atom_id=None, link=None,
                 title=None, updated=None, scope=None, role=None,
                 extension_elements=None, extension_attributes=None, text=None):
        gdata.GDataEntry.__init__(self, author=None, category=category,
                                  content=None, atom_id=atom_id, link=link,
                                  published=None, title=title,
                                  updated=updated, text=None)
        self.scope = scope
        self.role = role


def DocumentListAclEntryFromString(xml_string):
    """Converts an XML string into a DocumentListAclEntry object.

    Args:
      xml_string: string The XML describing a Document List ACL feed entry.

    Returns:
      A DocumentListAclEntry object corresponding to the given XML.
    """
    return atom.CreateClassFromXMLString(DocumentListAclEntry, xml_string)


class DocumentListFeed(gdata.GDataFeed):
    """A feed containing a list of Google Documents Items"""

    _tag = gdata.GDataFeed._tag
    _namespace = atom.ATOM_NAMESPACE
    _children = gdata.GDataFeed._children.copy()
    _attributes = gdata.GDataFeed._attributes.copy()
    _children['{%s}entry' % atom.ATOM_NAMESPACE] = ('entry',
                                                    [DocumentListEntry])


def DocumentListFeedFromString(xml_string):
    """Converts an XML string into a DocumentListFeed object.

    Args:
      xml_string: string The XML describing a DocumentList feed.

    Returns:
      A DocumentListFeed object corresponding to the given XML.
    """
    return atom.CreateClassFromXMLString(DocumentListFeed, xml_string)


class DocumentListAclFeed(gdata.GDataFeed):
    """A DocList ACL feed flavor of a Atom feed"""

    _tag = gdata.GDataFeed._tag
    _namespace = atom.ATOM_NAMESPACE
    _children = gdata.GDataFeed._children.copy()
    _attributes = gdata.GDataFeed._attributes.copy()
    _children['{%s}entry' % atom.ATOM_NAMESPACE] = ('entry',
                                                    [DocumentListAclEntry])


def DocumentListAclFeedFromString(xml_string):
    """Converts an XML string into a DocumentListAclFeed object.

    Args:
      xml_string: string The XML describing a DocumentList feed.

    Returns:
      A DocumentListFeed object corresponding to the given XML.
    """
    return atom.CreateClassFromXMLString(DocumentListAclFeed, xml_string)
